package pms.dao;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import pms.om.Feiertag;

public class FeiertagDao extends HibernateDaoSupport {
	
	/**
	 * R&uuml;ckgabe eines {@link Feiertag} anhand der Id
	 * @param id
	 * @return ausgew&auml;hlter Feiertag
	 */

	public Feiertag findById(int id) {
		HibernateTemplate template = getHibernateTemplate();
		return (Feiertag) template.get(Feiertag.class, id);
	}
					
	/**
	 * R&uuml;ckgabe aller Feiertage
	 * @return alle Feiertage
	 */

	@SuppressWarnings("unchecked")
	public Set<Feiertag> findAll() {
		HibernateTemplate template = getHibernateTemplate();
		List<Feiertag> allefeiertage = template.loadAll(Feiertag.class);
		Set<Feiertag> results = new HashSet<Feiertag>();
		for (Feiertag feiertag : allefeiertage) {
			results.add(feiertag);
		}
		return results;
	}
			    
	/**
	 * Anlegen eines neuen Feiertages
	 * @param feiertagsname
	 * @param feiertagsdatum
	 */

	public void create(String feiertagsname, Date feiertagsdatum) {
		HibernateTemplate template = getHibernateTemplate();
		Feiertag f = new Feiertag(feiertagsname, feiertagsdatum);
		template.persist(f);
	}

	/**
	 * &Auml;ndern des Feiertages anhand der ausgew&auml;hlten Id auf die neuen 
	 * &uuml;bergebenen Eigenschaften
	 * @param id
	 * @param feiertagsname
	 * @param feiertagsdatum
	 */	

	public void modify(int id, String feiertagsname, Date feiertagsdatum) {
		HibernateTemplate template = getHibernateTemplate();
		Feiertag f = (Feiertag) template.get(Feiertag.class, id);
		f.setFeiertagsname(feiertagsname);
		f.setFeiertagsdatum(feiertagsdatum);
		template.saveOrUpdate(f);
		template.flush();
	}

	/**
	 * L&ouml;schen des ausgew&auml;hlten Feiertages
	 * @param id
	 */

	public boolean deleteById(int id) {
		HibernateTemplate template = getHibernateTemplate();
		boolean result = false;
		Feiertag f = findById(id);
		if (f.getJahremitdenfeiertagen().isEmpty()) {   // nur wenn Feiertag noch nicht zugeordnet 
			template.delete(f);                         // dann löschen
			template.flush();
			result = true;
		}
		return result;
	}


	/** 
	 * R&uuml;ckgabe des Set weniger des Feiertages f
	 * @return Finde alle bis auf einen
	 */

	public Set<Feiertag> findAllebisaufEinen(Feiertag f, Set<Feiertag> sf) {
		Set<Feiertag> result = new HashSet<Feiertag>();
		for (Feiertag feiertag : sf) {
			if (!feiertag.equals(f)) {
				result.add(feiertag);
			}
		}
		return result;
	}

	
	/**
	 * R&uuml;ckgabe aller Feiertage ohne die Feiertage des &uuml;bergebenen Sets
	 * @return Finde alle Feiertage, die nicht zugeordnet sind
	 */

	public Set<Feiertag> findeallefeiertagedienichtzugeordnet(Set<Feiertag> sf) {
		Set<Feiertag> result = findAll();
		for (Feiertag feiertag : sf) {
			result = findAllebisaufEinen(feiertag, result);
		}
		return result;
	}

    /**
     *  Pr&uuml;fen ob Eingabe ein g&uuml;ltiges Datum ist
     * @param feiertagsdate
     * @throws Exception
     */

	public boolean pruefeDatum(String feiertagsdate) throws Exception {
		DatumPruefer d = new DatumPruefer();
		return d.datumOK(feiertagsdate);
	}


}
